import 'dart:io';

main() {
  print('程序开始，执行 main 入口函数');

  // 回调地狱（不推荐：嵌套较深，捕获错误麻烦）
  // getFirstData().then((value) {
  //   print('第一个函数执行完成，结果是：$value');
  //   getSecondData().then((value) {
  //     print('第二个函数执行完成，结果是：$value');
  //     getThirdData().then((value) {
  //       print('第三个函数执行完成，结果是：$value');
  //     });
  //   });
  // });

  // 链式调用
  getFirstData().then((value) {
    print('第一个函数执行完成，结果是：$value');
    return getSecondData();
  }).then((value) {
    print('第二个函数执行完成，结果是：$value');
    return getThirdData();
  }).then((value) {
    print('第三个函数执行完成，结果是：$value');
  }).catchError((error) {
    // 链式调用，结构更加清晰，而且能统一捕获错误!!
    print('捕获到错误：$error');
  }).whenComplete(() {
    print('不管成功失败，都会执行 whenComplete');
  });

  print('不能堵塞的代码');
}

// 第一个获取数据的函数
Future<int> getFirstData() {
  return Future(() {
    sleep(Duration(seconds: 2));
    // throw '第一个函数执行失败';
    return 11;
  });
}

// 第二个获取数据的函数
Future<int> getSecondData() {
  return Future(() {
    sleep(Duration(seconds: 2));
    // return 22;
    throw '第二个函数执行失败';
  });
}

// 第三个获取数据的函数
Future<int> getThirdData() {
  return Future(() {
    sleep(Duration(seconds: 2));
    return 33;
  });
}
